package json

import (
	"codejy/store"
	"codejy/structdef"
	"codejy/typedefault"
	"codejy/utils"
	"strings"
)

type JsonObj struct {
	Addr        string
	ThreadStore *structdef.ThreadStore
	Obj         map[string]string
}

// 创建实例
func (a *JsonObj) CreateTypeDefault(addr string, threadStore *structdef.ThreadStore, parameter ...string) {
	s := parameter[0]
	//判断是否是json对象
	validJSON := utils.IsValidJSONObject(s)
	if !validJSON {
		panic("不是json,请检查格式")
	}
	jsonObj := utils.JsonToMap(s)
	instance := &JsonObj{
		Addr:        addr,
		ThreadStore: threadStore,
		Obj:         jsonObj,
	}
	store.AddTypeDefaultInstanceStore(threadStore, a.GetTypeName(), addr, instance)
}
func (a *JsonObj) ParameterProcessing(parameter []string) []string {
	//排除前后""
	for i := range parameter {
		s := parameter[i]
		if strings.HasPrefix(s, "\"") && strings.HasSuffix(s, "\"") {
			s = s[1 : len(s)-1]
			parameter[i] = s
		}
	}
	return parameter
}

func (a *JsonObj) GetData() interface{} {
	return a.Obj
}

func (a *JsonObj) ToStr() string {
	value1, b1 := typedefault.GetTypeDefaultValue[map[string]string](a.ThreadStore, a.GetTypeName(), a.Addr)
	if b1 {
		return utils.JsonToMapStr(value1)
	}
	return ""
}

// 获取key对应的值
func (a *JsonObj) Get(key string) string {
	v := a.Obj[key]
	return v
}

// 添加或修改一个key-value
func (a *JsonObj) Set(key, value string) {
	a.Obj[key] = value
}

// 删除一个key-value
func (a *JsonObj) Del(key string) {
	delete(a.Obj, key)
}

func (f *JsonObj) GetDef() string {
	return `
		@CodeManual(def="new("JsonObj")",des="创建Json对象转换实例")
		type JsonObj{
			//传入json字符串
			def init{
				core&CreateTypeDefault($1)
			}
			@CodeManual(def="toStr()",des="将json对象转换为json字符串")
			def toStr{
				to core&ToStr()
			}
			@CodeManual(def="get(key)",des="获取key对应的值")
			def get{
				to core&Get($1)
			}
			@CodeManual(def="set(key,value)",des="添加或修改key-value,value只能是字符串")
			def set{
				core&Set($1,$2)
			}
			@CodeManual(def="del(key)",des="删除一个key-value")
			def del{
				core&Del($1)
			}
		}
	`
}
func init() {
	typedefault.RegisterTypeDefault(&JsonObj{})
}

func (f *JsonObj) GetTypeName() string {
	return "JsonObj"
}

// 将json字符串转换为JsonObj对象
func StrToJsonObj(jsonObj string, threadStore *structdef.ThreadStore) string {
	jsonObjMap := utils.JsonToMap(jsonObj)
	addr := typedefault.TypeDefaultNewInstance("JsonObj", threadStore)
	newList := &JsonObj{
		Addr:        addr,
		ThreadStore: threadStore,
		Obj:         jsonObjMap}

	store.AddTypeDefaultInstanceStore(threadStore, "JsonObj", addr, newList)
	return addr
}

// 将map转换为JsonObj对象
func MapToJsonObj(jsonObjMap map[string]string, threadStore *structdef.ThreadStore) string {
	addr := typedefault.TypeDefaultNewInstance("JsonObj", threadStore)
	newList := &JsonObj{
		Addr:        addr,
		ThreadStore: threadStore,
		Obj:         jsonObjMap}

	store.AddTypeDefaultInstanceStore(threadStore, "JsonObj", addr, newList)
	return addr
}
